
/*
n个点m条边，可能存在重边和自环
输出拓扑排序

样例：
第一行n和m
接下来m行，每行两个整数x和y，有向边(x,y)

3 3
1 2
2 3
1 3

输出：1 2 3
*/
#include <bits/stdc++.h>
using namespace std;

const int N = 100010;

int n,m;

//对于每个点k，开一个单链表，存储k所有可以走到的点。h[k]存储这个单链表的头结点
//e[]存储节点的值，ne[]存储节点的next指针，idx表示当前用到了哪个节点
int h[N],e[N],ne[N],idx;
int q[N],d[N];
//d[i] 存储点i的入度，q[]是队列

void add(int a,int b){
  e[idx]=b;
  ne[idx]=h[a];
  h[a]=idx++;
}

//队列实现
bool topsort(){
  int hh=0,tt=-1;
  //将所有入度不为0的点插入到队列中
  for(int i=1;i<=n;i++){
    if(!d[i])
      q[++tt]=i;
  }
  while(hh<=tt){
    int t=q[hh++];
    for(int i=h[t];i!=-1;i=ne[i]){
      int j=e[i];
      d[j]--;
      if(d[j]==0) q[++tt]=j;
    }
  }
  return tt==n-1;
}
int main() {
  cin>>n>>m;
  memset(h,-1,sizeof h);
  for(int i=0;i<m;i++){
    int a,b;
    cin>>a>>b;
    add(a,b);
    d[b]++;//b的入度+1
  }

  if(topsort()){
    for(int i=0;i<n;i++) printf("%d ",q[i]);
    puts("");
  }else{
    puts("-1");
  }

  return 0;
}
